//package com.lu.stack.api.support.jobtask;
//
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.extra.spring.SpringUtil;
//import com.alibaba.fastjson.JSON;
//import com.jshb.market.common.model.constants.SystemApplication;
//import com.jshb.market.common.model.domain.RedisKeyDo;
//import com.jshb.market.common.model.enums.DistributedLockStrategyEnum;
//import com.jshb.market.common.model.response.R;
//import com.jshb.market.config.DistributedLock;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.Resource;
//import java.util.concurrent.TimeUnit;
//import java.util.function.Supplier;
//
///**
// * @author zhanglu
// * @project dev-zhanglu-20230130
// * @description 分布式定时任务
// * @date 2023/3/3 10:28
// */
//@Slf4j
////@Component
//public abstract class DistributedJobAbstract {
//
//    @Resource
//    private RedisTemplate redisTemplate;
//
//    protected abstract void scheduledTask();
//
//    @PostConstruct
//    public void init(){
//        SpringUtil.getBeansOfType(DistributedJobAbstract.class).forEach((k, v) -> {
//            v.scheduledTask();
//        });
//    }
//
//    /**
//     * 模版方法
//     * @param code
//     * @param intervalSupplier
//     */
//    public void execute(String code, Supplier<String> intervalSupplier, Supplier<R> supplier){
//        new Thread(() -> {
//            while (true){
//                Object o = redisTemplate.opsForValue().get(code);
//                if(o != null){
//                    if(log.isDebugEnabled() || !SystemApplication.applicationContext.isProd()){
//                        log.debug("{}定时任务正在执行", code);
//                    }
//                    continue;
//                }
//                String intervalStr = intervalSupplier.get();
//                Integer interval = ObjectUtil.isEmpty(intervalStr) ? 60 : Integer.valueOf(intervalStr);
//                DistributedLock.execute(() -> {
//                    Object o2 = redisTemplate.opsForValue().get(RedisKeyDo.jobTaskLastExecuteTime(code));
//                    if(o2 != null){
//                        if(log.isDebugEnabled() || !SystemApplication.applicationContext.isProd()){
//                            log.debug("{}定时任务正在执行", code);
//                        }
//                        return null;
//                    }
//                    redisTemplate.opsForValue().set(RedisKeyDo.jobTaskLastExecuteTime(code), "1", interval, TimeUnit.SECONDS);
//                    //逻辑
//                    log.info("{}定时任务业务逻辑执行开始", code);
//                    R r = supplier.get();
//                    log.info("{}定时任务业务逻辑执行结束,结果:{}", code, JSON.toJSONString(r));
//                    return r;
//                }, DistributedLockStrategyEnum.MARKET_JOB_TASK_HOME_PAGE);
//                try {
//                    TimeUnit.SECONDS.sleep(interval + 1);
//                } catch (Exception e) {
//                    log.error(code + "定时任务等待异常", e);
//                }
//            }
//        }, code).start();
//    }
//
//}
